var common_report_utils_data = {
  page_url: '', // 所属页面
  isCheckReport: false, //是否精简上报
  channelId: '', //当前渠道ID
  linkId: '', //当前链接ID
  utm_ad_id: '', //活动/广告id
  utm_campaign: '', //活动/广告名称
  utm_content: '', //活动/广告内容
  utm_source: '', //活动/广告来源
  utm_term: '', //活动/广告关键字
  utm_medium: '',
  init_status: 0, //上报SDK是否初始化 0未初始化 1已经初始化或者正在初始化 
}
/**
 * 动态修改common_report_utils_data 部分数据
 * @param {String} key key
 * @param {String} val key's value
 */
function set_attr(key, val) {
  if (common_report_utils_data.hasOwnProperty(key)) {
    common_report_utils_data[key] = val
    console.log('=============>set_attr', key, val, common_report_utils_data)
  } else {
    console.error(
      `common_report_utils.js -> function (set_attr) error -> reason:reprot_utils_data key:${key} is undefined`
    )
  }
}
/**
 * 上报初始化
 * @param {Object} obj 上报数据
 * @param {String} obj.channelId  渠道id
 * @param {String} obj.linkId   链接id
 * @param {String} obj.utm_ad_id
 * @param {String} obj.utm_campaign
 * @param {String} obj.utm_content
 * @param {String} obj.utm_source
 * @param {String} obj.utm_term
 */
function report_initSdk(obj) {
  if (typeof obj !== 'object' || common_report_utils_data.init_status) return
  set_attr('init_status', 1)
  const {
    channelId,
    linkId,
    utm_ad_id,
    utm_campaign,
    utm_content,
    utm_source,
    utm_term,
    utm_medium
  } = obj
  common_report_utils_data = Object.assign({}, common_report_utils_data, obj)
  REPORT_SDK.sdk_init({
    qd_id: channelId,
    link_id: linkId,
    utm_ad_id,
    utm_campaign,
    utm_content,
    utm_source,
    utm_medium,
    menu_bar: 0,
    login_state: 0,
    pay_state: 0,
    mode_state: 0,
  })
}
/**
 * 检测函数参数是否完整
 * @param {String} funcName 函数名称
 * @param {Array} argArr 检查的参数数组
 * @returns true为完整  false为不完整
 */
function check_params_integrity(funcName, argArr) {
  if (process.env.NODE_ENV !== 'development') return true
  let filterRes = argArr.filter((item) => !item && item !== 0)
  if (filterRes.length > 0) {
    console.error(
      `common_report_utils.js -> function (check_params_integrity) argArr error -> reason: function ${funcName} -> Some parameters are empty! argArr==>`,
      argArr
    )
    return false
  } else {
    return true
  }
}
/**
 * 页面展示上报
 * @param {String} referer 页面来源 属性值包括(首页，砍价详情页等)页面名称、渠道（第一个页面来源为渠道）
 * @param {String} result 小说ID
 * @param {String} page_name 章节ID
 * @param {String} page_type 商品ID
 * @description 事件统计范围：所有的页面访问 页面oninit
                事件上报机制：访问的页面发现改变时上报；
                小说阅读页，增加小说id，章节等
 */
function page_show_report(
  referer,
  result = '',
  page_name = '',
  page_type = '',
  ext_field_9 = ''
) {
  if (!check_params_integrity('page_show_report', [referer])) return
  try {
    reportFunc({
      event_id: 'page_show',
      event_name: 'n_页面展示',
      referer,
      result,
      page_name,
      page_type,
      ext_field_9,
    })
  } catch (error) { }
}

/**
 * 页面点击上报
 * @param {String} element_name 点击元素
 * @param {String} ext_field_9 H5url H5页面的url
 * @param {String} result 小说ID
 * @param {String} page_name 章节ID
 * @param {String} scence 场景
 * @param {String} page_type 商品ID
 * @param {Number} duration 翻页次数 每次启动从1开始，小说阅读页点击下一页时上报，启动第一次点击下一页上报1，第二次点击下一页上报2···
 */
function page_click_report(
  element_name,
  ext_field_9 = '',
  result = '',
  page_name = '',
  ad_position = '',
  page_type = '',
  duration = 0,
) {
  if (!check_params_integrity('page_click_report', [element_name])) return
  try {
    reportFunc({
      event_id: 'page_click',
      event_name: 'n_页面点击元素',
      element_name,
      result,
      page_name,
      ad_position,
      page_type,
      duration,
      ext_field_9,
    })
  } catch (error) { }
}

/**
 * 启动上报
 * @param {String} ad_type 来源类型 app.getInfo()，获取来源类型，二级来源，值为 shortcut、push、url、barcode、nfc、bluetooth、other
 * @param {String} result 平台版本号
 * @param {String} page_type 启动次数
 * @param {String} ad_style 取渠道链接参数上报的imei
 * @description 事件统计范围：打开APP的人数跟次数；
                事件上报机制：启动APP时上报
                链接ID与渠道ID对应说明：-1（自然用户）、-2（分享链接）、-3（扫码）
                事件上报机制：启动APP时上报
 */
function hap_report(
  ad_type = '',
  page_type = '',
  result = '',
  ad_style = '',
  element_name = ''
) {
  try {
    reportFunc({
      event_id: 'hap',
      event_name: '启动',
      ad_type,
      page_type,
      result,
      ad_style,
      element_name
    })
  } catch (error) { }
}

/**
 * 创建图标上报
 * @param {String} result 创建结果 成功 失败
 * @param {String} scene  触发元素 创建方式 加桌弹窗、悬浮横幅、被动加桌
 * @param {String} referer  页面来源 属性值包括(首页，砍价详情页等)页面名称、渠道（第一个页面来源为渠道）
 * @description 事件统计范围：创建图标的结果
                事件上报机制：触发加桌按钮时得知结果后上报  
 */
function add_icon_report(result, scene, referer, page_name = '') {
  if (!check_params_integrity('add_icon_report', [result, scene, referer]))
    return
  try {
    reportFunc({
      event_id: 'add_icon',
      event_name: '创建图标',
      result,
      scene,
      referer,
      page_name
    })
  } catch (error) { }
}

/**
 * 系统异常上报
 * @param {String} page_name 页面名称
 * @param {String} result 异常信息，建议长度在1024以内，超出前端截断
 * @param {String} referer 触发来源 初始化sdk 接口请求 解析配置 解析任务 全局异常$页面
 * @param {String} page_type 异常类型 错误类型范围：所有类型，必须包含：内部错误、响应超时、找不到接口 响应超时：响应超过2s上报
 * @description 事件统计范围：捕捉所有接口请求、初始化sdk、解析配置、key解析、解析任务信息、全局error包括app的onError
                事件上报机制：错误发生时，记录异常日志上报
 */
function error_log_report(page_name, result, referer, page_type) {
  if (
    !check_params_integrity('error_log_report', [
      page_name,
      result,
      referer,
      page_type,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'error_log',
      event_name: '系统异常',
      page_name,
      result,
      referer,
      page_type,
    })
  } catch (error) { }
}

/**
 * 用户使用时长上报
 * @param {Number} duration 用户访问页面停留的累计时长（单位ms）
 */
function used_duration_report(duration) {
  if (!check_params_integrity('used_duration_report', [duration])) return
  try {
    reportFunc({
      event_id: 'used_duration',
      event_name: '用户使用时长',
      duration,
    })
  } catch (error) { }
}

/**
 * 策略获取上报
 * @param {String} result  获取结果 成功、失败
 * @param {String} element_name  所属策略
 * @param {String} referer  路由名称
 * @param {String} scene  广告配置
 */
function strategy_obtain_report(result, referer) {
  if (
    !check_params_integrity('strategy_obtain_report', [
      result,
      referer,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'strategy_obtain',
      event_name: '策略获取',
      result,
      referer,
    })
  } catch (error) { }
}

/**
 * 广告跳转超时上报
 * @param {String} ad_position  广告位置
 * @description 上报机制：点击广告在配置时间内未跳转
 */
function ad_overtime_report(ad_position) {
  if (!check_params_integrity('ad_overtime_report', [ad_position]))
    return
  try {
    reportFunc({
      event_id: 'ad_overtime',
      event_name: '广告跳转超时',
      ad_position
    })
  } catch (error) { }
}

/**
 * 物理返回上报
 * @param {String} ad_position  弹窗名称 关闭弹窗、触发弹窗对应的弹窗名称
 * @param {String} page_type  关闭弹窗、触发弹窗对应的弹窗组名称
 * @param {String} element_name  执行动作 关闭弹窗、触发弹窗、返回上页、退出应用、关闭弹窗拦截、触发弹窗拦截,初始化拦截
 * @description 事件上报机制：用户触发物理返回执行的动作，用户点击物理返回时上报，

                属性值说明：关闭弹窗锁定：在弹窗锁定期间，用户点击物理返回触发锁定未能关闭弹窗，多次返回只第一次上报
                            触发弹窗锁定：用户点击物理返回，由于设置广告展示间隔导致未触发弹窗 ，多次返回只第一次上报
                            初始化拦截：用户启动应用 自定义弹窗尚未展示时，点击物理返回被拦截上报，多次返回只第一次上报
                关闭弹窗并触发下一页时，只报到关闭弹窗；如果触发弹窗因为没有广告到下一个页面，报到触发弹窗
 */
function back_click_report(ad_position, page_type, element_name) {
  if (
    !check_params_integrity('back_click_report', [
      element_name,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'back_click',
      event_name: '物理返回',
      ad_position,
      page_type,
      element_name,
    })
  } catch (error) { }
}

/**
 * 应用状态上报
 * @param {String} referer 页面来源 属性值包括(首页，砍价详情页等)页面名称、渠道（第一个页面来源为渠道）
 * @param {String} result  应用状态 onshow、onhide、oncreate
 * @description 事件上报机制：应用状态切换时候上报
 */
function app_state_report(referer, result) {
  if (!check_params_integrity('app_state_report', [referer, result])) return
  try {
    reportFunc({
      event_id: 'app_state',
      event_name: '应用状态',
      referer,
      result,
    })
  } catch (error) { }
}

/**
 * 广告请求上报
 * @param {String} ad_id 广告位id
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} ad_type 广告类型 $原生 $视频 $横幅 $开屏
 * @param {String} page_name  场景名称
 * @param {String} page_type 广告组 配置下发：自定义弹窗组名称：阅读页自定义弹窗 小米阅读页自定义弹窗 等等，非自定义弹窗或返回弹窗，取广告名称
 * @param {String} ad_position 广告名称 配置下发：具体的弹窗名称：金币活动页，退出弹窗1000，返回弹窗顶部素材 等等，非自定义弹窗或返回弹窗，取广告名称
 * @param {String} result 事件结果 $发起请求 $有广告 $无广告+具体原因 
 * @param {String} ext_field_9 广告顺序 针对自定义弹窗和自定义返回弹窗，代表该弹窗上第几个广告的处理，取值1、2、3
 * @param {String} ad_style 交互类型 取厂商返回的interactionType,无数据取null
 * @param {String} ext_field_8 广告主
 * @param {String} ext_field_2 广告层级
 * @param {String} referer 是否第一轮广告
 * @param {String} scene 请求发起的场景，枚举值：【自动请求】、【补量请求】
 * @param {String} ext_field_1 bidding实时ecpm
 */
function ad_sdk_request_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  result,
  ext_field_9 = '1',
  ad_style = 'null',
  ext_field_8 = '',
  ext_field_2 = '1',
  referer = '',
  scene = '自动请求',
  ext_field_1 = ''
) {
  if (
    !check_params_integrity('ad_sdk_request_report', [
      ad_id,
      ad_network,
      ad_type,
      page_name
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'ad_sdk_request',
      event_name: '广告请求SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      result,
      ext_field_9,
      ad_style,
      ext_field_8,
      ext_field_2,
      referer,
      scene,
      ext_field_1
    })
  } catch (error) { }
}

/**
 * 广告展示上报
 * @param {String} ad_id 广告位id
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} ad_type 广告类型 $原生 $视频 $横幅 $开屏
 * @param {String} page_name  广告场景 配置下发：自定义弹窗,自定义返回弹窗,底部banner，中插广告,$页面名称
 * @param {String} page_type 广告组 配置下发：自定义弹窗组名称：阅读页自定义弹窗 小米阅读页自定义弹窗 等等
 * @param {String} ad_position 广告名称 配置下发：具体的弹窗名称：金币活动页，退出弹窗1000，返回弹窗顶部素材 等等
 * @param {String} ext_field_9 广告顺序 针对自定义弹窗和自定义返回弹窗，代表该弹窗上第几个广告的处理，取值1、2、3
 * @param {String} ad_style 交互类型 取厂商返回的interactionType,无数据取null
 * @param {String} result 展示结果 $播放完成$播放未完成，代表激励视频播放完成与否、其他类型广告取空值
 * @param {String} ext_field_8 广告主
 * @param {String} ext_field_2 广告层级
 * @param {String} referer 是否第一轮广告
 * @param {String} scene 请求发起的场景，枚举值：【自动请求】、【补量请求】
 * @param {String} ext_field_1 bidding实时ecpm
 */

function ad_sdk_show_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  ext_field_9 = '1',
  ad_style = 'null',
  result = '',
  ext_field_8 = '',
  ext_field_2 = '1',
  referer = '',
  scene = '自动请求',
  ext_field_1 = ''
) {
  if (
    !check_params_integrity('ad_sdk_show_report', [
      ad_id,
      ad_network,
      ad_type,
      page_name
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'ad_sdk_show',
      event_name: '广告展示SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      ext_field_9,
      ad_style,
      result,
      ext_field_8,
      ext_field_2,
      referer,
      scene,
      ext_field_1
    })
  } catch (error) { }
}

/**
 * 广告点击上报
 * @param {String} ad_id 广告位id
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} ad_type 广告类型 $原生 $视频 $横幅 $开屏
 * @param {String} page_name  广告场景 自定义弹窗,自定义返回弹窗,底部banner，中插广告,$页面名称
 * @param {String} page_type 广告组 自定义弹窗组名称：阅读页自定义弹窗 小米阅读页自定义弹窗 等等
 * @param {String} ad_position 广告名称 具体的弹窗名称：金币活动页，退出弹窗1000，返回弹窗顶部素材 等等
 * @param {String} element_name 触发元素 触发广告用户点击的元素：按钮/素材/热区误触
 * @param {String} ext_field_9 广告顺序 针对自定义弹窗和自定义返回弹窗，代表该弹窗上第几个广告的处理，取值1、2、3
 * @param {String} ad_style 交互类型 取厂商返回的interactionType,无数据取null
 * @param {String} ext_field_8 广告主
 * @param {String} ext_field_2 广告层级
 * @param {String} referer 是否第一轮广告
 * @param {String} scene 请求发起的场景，枚举值：【自动请求】、【补量请求】
 * @param {String} ext_field_1 bidding实时ecpm
 */
function ad_sdk_click_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  element_name,
  ext_field_9 = '1',
  ad_style = 'null',
  ext_field_8 = '',
  ext_field_2 = '1',
  referer = '',
  scene = '自动请求',
  ext_field_1 = '',
  ext_field_3 = '',
  ext_field_6 = '',
) {
  if (
    !check_params_integrity('ad_sdk_click_report', [
      ad_id,
      ad_network,
      ad_type,
      page_name,
      element_name
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'ad_sdk_click',
      event_name: '广告点击SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      element_name,
      ext_field_9,
      ad_style,
      ext_field_8,
      ext_field_2,
      referer,
      scene,
      ext_field_1,
      ext_field_3,
      ext_field_6,
    })
  } catch (error) { }
}
/**
 * 广告遗弃上报
 */

function ad_sdk_abandon_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  ext_field_9 = '1',
  ad_style = 'null',
  referer = '',
  ext_field_8 = '',
  ext_field_2 = '1',
  result = '',
  ext_field_3 = '是',
  scene = '自动请求',
  ext_field_1 = ''
) {
  try {
    reportFunc({
      event_id: 'ad_sdk_abandon',
      event_name: '广告遗弃SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      ext_field_9,
      ad_style,
      referer,
      ext_field_8,
      ext_field_2,
      result,
      ext_field_3,
      scene,
      ext_field_1
    })
  } catch (error) { }
}
/**
 * 自定义弹窗展示上报
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} page_type 广告组 自定义弹窗组名称：阅读页自定义弹窗 小米阅读页自定义弹窗 等等
 * @param {String} ad_position 广告名称 具体的弹窗名称：金币活动页，退出弹窗1000，返回弹窗顶部素材 等等
 * @param {String} ad_style 按钮文案模式 自定义文案、厂商返回文案
 * @param {String} page_name 展示结果 有、无
 * @param {String} ext_field_9 触发时机 取策略配置中弹窗对应的触发时机，页面进入、页面返回、弹窗关闭等
 * @param {String} ad_id 广告位id 取弹窗对应广告的广告位id，多个广告取按钮绑定的广告位id
 * @param {String} referer 取弹窗配置中的功能类型
 * @param {String} ad_type 广告类型 $原生 $视频
 * @param {String} page_url 所属页面
 * @param {String} ext_field_1 bidding实时ecpm
 */
function custom_popup_show_report(
  ad_network,
  page_type,
  ad_position,
  ad_style,
  page_name,
  ext_field_9,
  ext_field_2,
  ad_id = '',
  scene = '',
  referer,
  ad_type = '原生',
  ext_field_8 = '',
  ext_field_1 = ''
) {
  if (
    !check_params_integrity('custom_popup_show_report', [
      ad_network,
      page_type,
      ad_position,
      ad_style,
      page_name,
      ext_field_9,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'custom_popup_show',
      event_name: 'n_自定义弹窗展示',
      ad_id,
      ad_network,
      page_type,
      ad_position,
      ad_style,
      page_name,
      ad_type,
      ext_field_9,
      ext_field_2,
      scene,
      referer,
      ext_field_8,
      ext_field_1
    })
  } catch (error) { }
}

/**
 * 自定义弹窗点击上报
 * @param {String} page_type 广告组 自定义弹窗组名称：阅读页自定义弹窗 小米阅读页自定义弹窗 等等
 * @param {String} ad_position 广告名称 具体的弹窗名称：金币活动页，退出弹窗1000，返回弹窗顶部素材 等等
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} element_name 点击元素 返回按钮 关闭 正向按钮 负向按钮 素材上 素材中 素材下 误触热区  物理返回  若2.0无法区分热区和按钮，上报按钮即可
 * @param {String} ad_style 按钮文案模式 自定义文案、厂商返回文案
 * @param {String} page_name 展示结果 有、无
 * @param {String} ext_field_9 触发时机 取策略配置中弹窗对应的触发时机，页面进入、页面返回、弹窗关闭等
 * @param {String} ext_field_2 执行动作 根据运营配置的行为来，执行什么动作
 * @param {String} ad_id 广告位id 取弹窗对应广告的广告位id，多个广告取按钮绑定的广告位id
 * @param {String} scene 触发时机 取策略配置中弹窗对应的触发时机，页面进入、页面返回、弹窗关闭等
 * @param {String} ad_type 广告类型 $原生 $视频
 * @param {String} referer 取弹窗配置中的功能类型
 * @param {String} ext_field_3 ad点击坐标
 * @param {String} ext_field_6 九宫格区域
 */
function custom_popup_click_report(
  page_type,
  ad_position,
  ad_network,
  element_name,
  ad_style,
  page_name,
  ext_field_9,
  ext_field_2,
  ad_id = '',
  scene = '',
  referer,
  ad_type = '原生',
  ext_field_8 = '',
  ext_field_1 = '',
  ext_field_3 = '',
  ext_field_6 = '',
) {
  if (
    !check_params_integrity('custom_popup_click_report', [
      page_type,
      ad_position,
      ad_network,
      element_name,
      ad_style,
      page_name,
      ext_field_9,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'custom_popup_click',
      event_name: 'n_自定义弹窗点击',
      page_type,
      ad_position,
      ad_network,
      element_name,
      ad_style,
      page_name,
      ext_field_9,
      ad_type,
      ad_id,
      scene,
      ext_field_2,
      referer,
      ext_field_8,
      ext_field_1,
      ext_field_3,
      ext_field_6,
    })
  } catch (error) { }
}

/**
 * 页面关闭上报
 * @param {String} ext_field_9 H5url H5页面的url
 */
function page_close_report(ext_field_9) {
  try {
    reportFunc({
      event_id: 'page_close',
      event_name: 'n_页面关闭',
      ext_field_9
    })
  } catch (error) { }
}

/**
 * 通用事件上报
 * @param {Object} params 参数
 */
function reportFunc(params) {
  const { page_url } = common_report_utils_data
  try {
    let _curParams = JSON.parse(JSON.stringify(params))
    LOG('reportFunc==========>', { ..._curParams, page_url })
    REPORT_SDK.report({ ..._curParams, page_url })
  } catch (error) { }
}
// 广告拿取SDK上报
function ad_sdk_take(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  ad_style,
  ext_field_9,
  referer,
  scene,
  ext_field_8,
  ext_field_2,
  result,
  ext_field_1 = ''
) {
  try {
    reportFunc({
      event_id: 'ad_sdk_take',
      event_name: '广告拿取SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      ad_style,
      ext_field_9,
      referer,
      scene,
      ext_field_8,
      ext_field_2,
      result,
      ext_field_1
    })
  } catch (error) { }
}
// 广告回池SDK上报
function ad_sdk_back(params, page_url) {
  try {
    reportFunc({
      event_id: 'ad_sdk_back',
      event_name: '广告回池SDK',
      ad_id: params.id,
      ad_network: params.ad_network,
      ad_type: params.ad_type,
      page_name: params.scenario,
      page_type: params.popGroupName,
      ad_position: params.popName,
      ad_style: params.ad_style,
      ext_field_9: String(params.requestNum),
      ext_field_2: params.ext_field_2 || '1',
      page_url: page_url,
      ext_field_1: params.isBidding && params.advDetail ? params.advDetail.ecpm + '' : ''
    })
  } catch (error) { }
}
function app_rise(params, page_url) {
  try {
    reportFunc({
      event_id: 'app_rise',
      event_name: 'APP整理',
      ad_id: params.id,
      ad_type: params.ad_type,
      page_name: params.scenario,
      page_type: params.popGroupName,
      ad_position: params.popName,
      ext_field_9: String(params.requestNum),
      page_url: page_url,
    })
  } catch (error) { }
}
function initiate_rise_report(params) {
  try {
    reportFunc({
      event_id: 'initiate_rise',
      event_name: '开始整理',
      ad_id: params.id,
      ad_type: params.ad_type,
      page_name: params.page_name,
      page_type: params.page_type,
      result: params.result,
      scene: params.scene,
      referer: params.referer,
    })
  } catch (error) { }
}

/**
 * 广告内容SDK
 * @param {String} ad_id 广告位id
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} ad_type 广告类型 $原生 $视频 $横幅 $开屏
 * @param {String} page_name  广告源
 * @param {String} page_type 广告组
 * @param {String} ad_position 广告名称
 * @param {String} ext_field_9 广告顺序 针对自定义弹窗和自定义返回弹窗，代表该弹窗上第几个广告的处理，取值1、2、3
 * @param {String} ad_style 交互类型 取厂商返回的interactionType,无数据取null
 * @param {String} referer 是否第一轮广告
 * @param {String} ext_field_8 二级广告主
 * @param {String} ext_field_2 广告层级
 * @param {String} result 展示结果
 * @param {String} scene 请求方式

 */
function ad_sdk_render_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  ext_field_9,
  ad_style,
  referer,
  ext_field_8,
  ext_field_2,
  result,
  scene,
  ext_field_1 = 1
) {
  try {
    reportFunc({
      event_id: 'ad_sdk_render',
      event_name: '广告渲染SDK',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      ext_field_9,
      ad_style,
      referer,
      ext_field_8,
      ext_field_2,
      result,
      scene,
      ext_field_1
    })
  } catch (error) { }
}
/**
 * 广告下载监听
 * @param {String} ad_id 广告位id
 * @param {String} ad_network 广告网络 1:$厂商 2:$WEB 3:$APP 4:$百度
 * @param {String} ad_type 广告类型 $原生 $视频 $横幅 $开屏
 * @param {String} page_name  获取请求发起时，策略后台对应的场景名称；激励视频弹窗上报【激励视频通用弹窗】；老版本的弹窗上报【通用自定义弹窗】
 * @param {String} page_type 弹窗组名称
 * @param {String} ad_position 弹窗样式名称
 * @param {String} ext_field_9 广告顺序 针对自定义弹窗和自定义返回弹窗，代表该弹窗上第几个广告的处理，取值1、2、3
 * @param {String} ad_style 交互类型 取厂商返回的interactionType,无数据取null
 * @param {String} referer 是否第一轮广告
 * @param {String} ext_field_8 广告主
 * @param {String} ext_field_2 广告数据ID
 * @param {String} scene 跳转的链接
 * @param {String} result 是、否
 */
function ad_download_report(params) {
  try {
    reportFunc({
      event_id: 'ad_download',
      event_name: '广告下载监听',
      ad_id: params.id,
      ad_network: params.ad_network,
      ad_type: params.ad_type,
      page_name: params.page_name,
      page_type: params.page_type,
      ad_position: params.ad_position,
      ext_field_9: params.ext_field_9,
      ad_style: params.ad_style,
      referer: params.referer,
      ext_field_8: params.ext_field_8,
      ext_field_2: params.ext_field_2,
      scene: params.scene,
      result: params.result,

    })
  } catch (error) { }
}
/**
 * 华为应用安装上报
 * @param {*} ad_id
 * @param {*} ad_network
 * @param {*} ad_type
 * @param {*} page_name
 * @param {*} page_type
 * @param {*} ad_position
 * @param {*} ext_field_9
 * @param {*} ad_style
 * @param {*} ext_field_8
 * @param {*} referer
 * @param {*} ext_field_2
 * @param {*} element_name
 * @param {*} scene
 * @param {*} ext_field_3
 * @returns
 */
function ad_sdk_install_report(
  ad_id,
  ad_network,
  ad_type,
  page_name,
  page_type,
  ad_position,
  ext_field_9 = '1',
  ad_style = 'null',
  ext_field_8 = '',
  referer = '0',
  ext_field_2 = '1',
  scene = '',
  ext_field_3 = '是',
  element_name = '按钮',
) {
  if (
    !check_params_integrity('ad_sdk_install_report', [
      ad_id,
      ad_network,
      ad_type,
      ad_position,
    ])
  )
    return
  try {
    reportFunc({
      event_id: 'Install_status',
      event_name: '安装状态监听',
      ad_id,
      ad_network,
      ad_type,
      page_name,
      page_type,
      ad_position,
      ext_field_9,
      ad_style,
      ext_field_8,
      referer,
      ext_field_2,
      scene,
      ext_field_3,
      element_name,
    })
  } catch (error) { }
}
// 广告频控上报
function ad_frequency_control(params) {
  try {
    reportFunc({
      event_id: 'ad_frequency_control',
      event_name: '广告频控',
      ad_id: params.ad_id,
      ad_network: params.ad_network,
      ad_type: params.ad_type,
      page_name: params.page_name,
      page_type: params.page_type,
      ad_position: params.ad_position,
      ad_style: params.ad_style,
      ext_field_9: String(params.requestNum),
      page_url: '',
      referer: params.referer,
      result: params.result,
      ext_field_2: params.ext_field_2,
      scene: params.scene
    })
  } catch (error) { }
}
/**
 * 促激活
 * @param {String} ad_id 
 * @param {String} ad_network
 * @param {Number} ad_type 点击广告、大退至桌面
 * @param {Number} scene 时机：立即，大腿
 * @param {Number} page_type 页面池、激活池
 * @param {Number} ext_field_8 广告主名称
 * @param {String} result
 */
function ad_activate_report(params) {
  try {
    reportFunc({
      event_id: 'ad_activate',
      event_name: '促激活',
      ad_id: params.id,
      ad_network: params.ad_network,
      ad_type: params.ad_type,
      scene: params.scene,
      page_type: params.page_type,
      ext_field_8: params.ext_field_8,
      result: params.result,
    })
  } catch (error) { }
}
const report_utils = {
  set_attr, //动态修改common_report_utils_data 部分数据
  report_initSdk, //上报初始化
  page_show_report, //页面展示上报
  page_click_report, //页面点击上报
  ad_sdk_request_report, //广告请求上报
  ad_sdk_show_report, //广告展示上报
  ad_sdk_click_report, //广告点击上报
  ad_sdk_abandon_report, // 广告遗弃
  custom_popup_show_report, //自定义弹窗展示上报
  custom_popup_click_report, //自定义弹窗点击上报
  ad_sdk_take,
  ad_sdk_back,
  initiate_rise_report,
  add_icon_report, //创建图标上报
  error_log_report, //系统异常上报
  strategy_obtain_report, //策略获取上报
  hap_report, //启动上报
  back_click_report, //物理返回上报
  app_state_report, //应用状态上报
  ad_overtime_report, //广告跳转超时上报
  app_rise,
  page_close_report,//页面关闭上报
  used_duration_report, //用户使用时长上报
  ad_sdk_render_report, // 广告渲染
  ad_download_report, // 下载监听
  ad_sdk_install_report, // 安装监听
  ad_frequency_control, // 广告频控
  ad_activate_report // 促激活
}

const hooktoglobal = global.__proto__ || global
hooktoglobal.COMMON_REPORT_UTILS = report_utils
export default report_utils
